package com.lyd.sweet.model;

import java.io.Serializable;

public class ResponseObject<T> implements Serializable {
    /**
     * 消息头
     */
    private ResponseHead head;

    /**
     * 接口服务返回的数据内容
     */
    private T data;

    /**
     * 默认构造函数
     */
    public ResponseObject() {
    }

    /**
     * @param code    消息头的接口状态码
     * @param message 消息头的接口处理结果消息
     * @param data    返回数据内容
     */
    private ResponseObject(String code, String message, T data) {
        this.head = new ResponseHead(code, message);
        this.data = data;
    }

    private ResponseObject(ServiceStatus ServiceStatus, T data) {
        this.head = new ResponseHead(ServiceStatus.getCode(), ServiceStatus.getDesc());
        this.data = data;
    }

    public ResponseHead getHead() {
        return head;
    }

    public T getData() {
        return data;
    }


    /**
     * 服务业务执行失败的默认方法
     *
     * @return
     */
    public static ResponseObject<String> fail() {
        return new ResponseObject<>(ServiceStatus.FAIL, "");
    }

    /**
     * 返回服务执行失败的结果。
     * 如果message为空，默认使用服务状态码对应的描述信息
     *
     * @param ServiceStatus 服务状态码
     * @param message       具体的需要返回给服务调用者的错误信息
     * @return
     */
    public static ResponseObject<String> fail(ServiceStatus ServiceStatus, String message) {
        return new ResponseObject<>(ServiceStatus.getCode(),
                (message != null && !message.equals("")) ? message : ServiceStatus.getDesc(),
                "");
    }

    /**
     * 返回服务执行失败，支持返回对象，同时兼容控制层返回ResponseObject<RooUser> 格式
     *
     * @param ServiceStatus
     * @param message
     * @param obj
     * @return
     */
    public static <T> ResponseObject<T> fail(ServiceStatus ServiceStatus, String message, T obj) {
        return new ResponseObject<T>(ServiceStatus.getCode(),
                (message != null && !message.equals("")) ? message : ServiceStatus.getDesc(),
                obj);
    }

    /**
     * 返回服务执行失败的结果.
     * message默认使用服务状态码对应的描述信息
     *
     * @param ServiceStatus
     * @return
     */
    public static ResponseObject<String> fail(ServiceStatus ServiceStatus) {
        return fail(ServiceStatus, "");
    }

    /**
     * 返回服务执行失败的结果。默认的状态码为：ServiceStatus.FAIL：101
     *
     * @param message 具体的需要返回给服务调用者的错误信息
     * @return
     */
    public static ResponseObject<String> fail(String message) {
        return fail(ServiceStatus.FAIL, message);
    }

    /**
     * 返回服务执行失败的结果。
     *
     * @param ServiceStatus
     * @param e             异常对象
     * @return
     */
    public static ResponseObject<String> fail(ServiceStatus ServiceStatus, Exception e) {
        return fail(ServiceStatus, e.getMessage());
    }

    /**
     * 返回处理成功的结果
     * 默认的状态码为：ServiceStatus.SUCCESS：00000
     *
     * @param data
     * @param <T>
     * @return
     */
    public static <T> ResponseObject<T> success(T data) {
        return new ResponseObject<>(ServiceStatus.SUCCESS, data);
    }

    /**
     * 返回处理成功的结果
     * 默认情况下建议使用 success(T data)方法。但遇到特殊情况，服务执行成功时仍然需要返回一些信息给前端的时候可以使用该方法。
     *
     * @param <T>
     * @param status  成功时需要说明的其他情况状态码
     * @param message 成功时需要说明的其他情况详细描述
     * @param data    服务执行成功后返回的结果
     * @return
     */
    public static <T> ResponseObject<T> success(String status, String message, T data) {

        return new ResponseObject<>((status != null && !status.equals("")) ? status : ServiceStatus.SUCCESS.getCode(),
                (message != null && !message.equals("")) ? message : ServiceStatus.SUCCESS.getDesc(),
                data);
    }
}
